Weboldal JAVA Spring Boot alapokon - 3

Az előző részben létrehoztuk az adatbázis táblákat, bele is pakoltunk pár teszt adatot, illetve JAVA oldalon az adattábláknak megfelelő JAVA osztályokat is létrehoztuk.

Ezúttal a Repository réteggel folytatjuk, itt hozzuk létre azokat az JPA parancsokat, ahol szükséges SQL utasításokat, amelyek egyik oldalról az SQL adatbázisból kérdezik le az adatokat, másik oldalról pedig továbbadjuk a következő réteg felé. GitHub-on megtalálhatóak a létrehozott osztályok:

StoryRepository: a Story adattáblához kapcsolódunk, azaz a weboldal bejegyzéseire készítünk el különböző lekérdezéseket. Fontos, hogy @Repository annotációval jelezzük, hogy a Repository réteghez tartozik. Létrehozása során kiterjesztjük a CrudRepository interface-t, amely CRUD funkcionalitásokat tesz lehetővé számunkra (CRUD = create, read, update, delete). Mivel a Spring Boot lényege pont az, hogy előttünk már megírták a főbb eljárásokat (így a CRUD utasításokat is), nekünk a megírásával már nem kell törődni, egyszerűen csak kiterjesztjük a saját kódunkban, ha kell felülírjuk, vagy csak simán felhasználjuk. Ezzel rengeteg időt tudunk megtakarítani magunknak, és az üzleti logika megvalósítására tudunk koncentrálni.

Ha megnézzük a kódot, akkor látjuk, hogy JPA használatával nagyon egyszerűek a lekérdezések az adatbázisból: a List findAll(); például nem más mint SQL nyelven a SELECT * FROM STORY. A Story findFirstByOrderByPostedDesc(); pegig egyenlő a SELECT * FROM STORY WHERE posted IN (SELECT max(posted) FROM story) LIMIT 1; SQL paranccsal. A List findFirstByCategoryIgnoreCaseOrderByPostedDesc(String category); esetében pedig megkeressük a Posted mező alapján sorba rendezett első rekordot Category szerint, figyelembe nem véve a nagy-kisbetűket. Ilyen egyszerű az egész.

Van lehetőség arra is, hogy magunknak definiáljunk SQL lekérdezéseket:

@Query(value = "SELECT s FROM Story s WHERE s.title = ?1")

Story findByTitle(@Param("title") String title);
Itt a @Query annotációval jelezzük, hogy egy SQL lekérdezést fogunk futtatni, ahol a ?1 nem más, mint a findByTitle-ként (vagy akármilyen nekünk tetsző néven) elnevezett metódusunk "title" paramétere, amelyet majd a következő, Service rétegen keresztül kapunk meg, és ez alapján kérdezünk le az adatbázisból (pl. ha a "JAVA" címet viselő cikket akarjuk lekérdezni és megjeleníteni weboldalunkon, akkor a "JAVA" Stringet adjuk át a findByTitle számára).

UserRepository: a User táblához kapcsolódunk, hasonló elvek szerint, mint a StoryRepository esetében. Itt a findByEmail JPA lekérdezéssel értelemszerűen a metódus számára, a Service réteg felől átadott email cím alapján keressük meg az adott felhasználót az adattáblában. Az így megkapott User objektum alapján a kapcsolódó Role lesz visszakereshető, de erről majd bővebben a Security rétegnél lesz szó.

RoleRepository: a Role táblához kapcsolódunk, jelen esetben ugyan nincsen külön lekérdezés az adattáblából, de ha szükséges valamilyen lekérdezés onnan, akkor itt megtehetjük.

Adatbázis kapcsolatok - Repository réteg
Adatbázis kapcsolatok - Repository réteg


Az így lekérdezett adatokat pedig szépen továbbadjuk a Service rétegnek, amely az adatbázis felől megkapott adatok üzleti logika szerinti feldolgozását teszi lehetővé. Itt folytatjuk a következő részben.